<?php
//SQL防注入类
// 使用方法 $sql_safe=new SqlSafe(); 即可
date_default_timezone_set('PRC');

class SqlSafe {
    private static $get_filter = "'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
    private static $post_filter = "\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
    private static $cookie_filter = "\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
    private static $log_dir="C:/php_sql_logs";
    /**
     * 构造函数
     */
    public function __construct($logs_path = '') {

        foreach($_GET as $key=>$value){$this->stopAttack($key,$value,$this->get_filter);}
        foreach($_POST as $key=>$value){$this->stopAttack($key,$value,$this->post_filter);}
        foreach($_COOKIE as $key=>$value){$this->stopAttack($key,$value,$this->cookie_filter);}
        if($logs_path != ""){self::$log_dir = $logs_path;}
    
	}
    /**
     * 参数检查并写日志
     */
    public function stopAttack($StrFiltKey, $StrFiltValue, $ArrFiltReq){
        if(is_array($StrFiltValue))$StrFiltValue = implode($StrFiltValue);
        if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue) == 1){   
            $this->writesLog("【客户端地址】".$_SERVER["REMOTE_ADDR"]."    【时间】".strftime("%Y-%m-%d %H:%M:%S")."    【注入文件】".$_SERVER["PHP_SELF"]."    【注入方式】".$_SERVER["REQUEST_METHOD"]."    【注入健】".$StrFiltKey."    【注入值】".$StrFiltValue);
            echo '您提交的参数非法,系统已记录您的本次操作！';
			exit(4);
        }
    }
    /**
     * SQL注入日志
     */
    public function writesLog($log){

		if (! file_exists(self::$log_dir)){ mkdir(self::$log_dir); } //如果目录不存在 就创建
        $log_path = self::$log_dir.'/'.strftime("%Y-%m-%d").'.log';
        $i=1;
		$bool_tf=true;
        while ($bool_tf){
            if (! file_exists($log_path)){
                break;
            }else{
                $file_size=filesize($log_path);
                if($file_size<1024*1024*2){ //限制日志文件2Mb大小
                    $bool_tf =false;
                }else{
                    $i++;
                    $log_path = self::$log_dir.'/'.strftime("%Y-%m-%d").'_'.$i.'.log';
                    $bool_tf=true;
                }
            }
        }
    file_put_contents($log_path,$log."\r\n",FILE_APPEND);
    }
}
?>